#include "./stl_util_test.h"

int twice( const int &value ){
	return 2 * value;
};
bool even( const int &value ){
	return (value % 2) == 0;
};
bool positive( const int &value ){
	return value > 0;
};

TEST(Apply, apply_ArrayInt_FuncTwice_FuncTwice) {

	// Arrange
	Array<int> list1, final_list1;
	list1, 0, 1, 2, 3;
	final_list1, 0, 4, 8, 12, 1;

	Array<int> expected;
	expected, 0, 4, 8, 12, 1;

	// Act
	Array<int> actual =
		( apply(
			apply( list1, twice ),
			twice
		), 1 );

	// Assert
	EXPECT_EQ( list1, final_list1 ) << "List1 " << list1 << " | FList1 " << final_list1 << pendl;
	EXPECT_EQ( expected, actual ) << "expected " << expected << " | actual " << actual << pendl;

};

//TEST(Apply, Applyer_ArrayInt_FuncTwice_FuncTwice) {
//
//	// Arrange
//	Array<int> list1, final_list1;
//	list1, 0, 1, 2, 3;
//	final_list1, 0, 4, 8, 12, 1;
//
//	Array<int> expected;
//	expected, 0, 4, 8, 12, 1;
//
//	// Act
//	Array<int> actual =
//		( Applyer( Applyer( list1, twice )(), twice )(), 1 );
//
//	// Assert
//	EXPECT_EQ( list1, final_list1 ) << "List1 " << list1 << " | FList1 " << final_list1 << pendl;
//	EXPECT_EQ( expected, actual ) << "expected " << expected << " | actual " << actual << pendl;
//
//};
//
//TEST(Apply, ApplyFolder_ArrayInt_FuncTwiceX4) {
//
//	// Arrange
//	Array<int> list1, final_list1;
//	list1, 0, 1, 2, 3;
//	final_list1, 0, 16, 32, 48;
//
//	ApplyHolder< Array<int>, int(*)(const int&) > func( list1, twice );
//
//	for( usint i = 0; i < 4; ++i )
//		func.operator()();
//
//	// Assert
//	EXPECT_EQ( list1, final_list1 ) << "List1 " << list1 << " | FList1 " << final_list1 << pendl;
//
//};
//
TEST(Apply, check_ArrayInt_FuncTwice_FuncTwice) {

	// Arrange
	Array<int> list1, final_list1;
	list1, 0, 1, 2, 3;
	final_list1, 0, 1, 2, 3;

	Array<int> expected;
	expected, 0, 4, 8, 12;

	// Act
	Array<int> actual = check(
		check( list1, twice ),
		twice
	);

	// Assert
	EXPECT_EQ( list1, final_list1 ) << "List1 " << list1 << " | FList1 " << final_list1 << pendl;
	EXPECT_EQ( expected, actual ) << "expected " << expected << " | actual " << actual << pendl;

};
//
//TEST(Apply, Checker_ArrayInt_FuncTwice_FuncTwice) {
//
//	// Arrange
//	Array<int> list1, final_list1;
//	list1, 0, 1, 2, 3;
//	final_list1, 0, 1, 2, 3;
//
//	Array<int> expected;
//	expected, 0, 4, 8, 12;
//
//	// Act
//	Array<int> actual = Checker( list1, twice )();
//	//Array<int> actual = Checker(
//	//	Checker( list1, twice )(),
//	//	twice
//	//)();
//
//	// Assert
//	EXPECT_EQ( list1, final_list1 ) << "List1 " << list1 << " | FList1 " << final_list1 << pendl;
//	EXPECT_EQ( expected, actual ) << "expected " << expected << " | actual " << actual << pendl;
//
//};
//
TEST(Apply, selec_ArrayInt_FuncEven_FuncPositive) {

	// Arrange
	Array<int> list1, final_list1;
	list1, 0, 1, 2, 3, 4, 5;
	final_list1, 0, 1, 2, 3, 4, 5;

	Array<int> expected;
	expected, 2, 4;

	// Act
	Array<int> actual = select(
		select( list1, even ),
		positive
	);

	// Assert
	EXPECT_EQ( list1, final_list1 ) << "List1 " << list1 << " | FList1 " << final_list1 << pendl;
	EXPECT_EQ( expected, actual ) << "expected " << expected << " | actual " << actual << pendl;

};
//
//TEST(Apply, Selecter_ArrayInt_FuncEven_FuncPositive) {
//
//	// Arrange
//	Array<int> list1, final_list1;
//	list1, 0, 1, 2, 3, 4, 5;
//	final_list1, 0, 1, 2, 3, 4, 5;
//
//	Array<int> expected;
//	expected, 2, 4;
//
//	// Act
//	Array<int> actual = Selecter(
//		Selecter( list1, even )(),
//		positive
//	)();
//
//	// Assert
//	EXPECT_EQ( list1, final_list1 ) << "List1 " << list1 << " | FList1 " << final_list1 << pendl;
//	EXPECT_EQ( expected, actual ) << "expected " << expected << " | actual " << actual << pendl;
//
//};
